Немодальный диалог создается функцией Create(). Создаем тестовое приложение, как SDI и именем TestDlgs. Создаем пункт меню в View с именем Dialog и идентификатором ID_DIALOG. К этому пункту меню привязываем команду.
/////////////////////////////////////////
// CTestDlgsView message handlers
void CTestDlgsView::OnDialog()
{
}
Теперь нужно создать диалог в ресурсах. Просто добавляем и все. Идентификатор у меня IDD_DIALOG1. Для того, чтобы диалог существовал нужно, чтобы существовал его объект. Для этого мы с Вами опишем переменную класса диалога в виде.
class CTestDlgsView : public CView
{
protected: // create from serialization only
CTestDlgsView();
DECLARE_DYNCREATE(CTestDlgsView)
// Attributes
public:
CTestDlgsDoc* GetDocument();
CDialog dlg;
// Operations
......
}
Создаем диалоговую панель при инициализации:
void CTestDlgsView::OnInitialUpdate()
{
CView::OnInitialUpdate();
dlg.Create(IDD_DIALOG1,this);
}
Ну, и реализацию функции для показа и скрытия:
void CTestDlgsView::OnDialog()
{
if (dlg.IsWindowVisible())
dlg.ShowWindow(SW_HIDE);
else
dlg.ShowWindow(SW_SHOW);
}
Посмотрим, как это работает. Диалог будет на экране и при этом не будет мешать работать с программой.

Обратите внимание, что диалог серый, то есть неактивный. Диалог может динамически создаваться и удаляться, а не скрываться. Кнопочка также может появляться и исчезать. Можно ввести пункт меню, который будет показывать есть ли на экране диалог или нет. Все можно. Только задача наша была создать немодальный диалог и мы ее решили. Чем хорош это диалог ??? Тем, что его можно утащить за окно программы, например.